home *** CD-ROM | disk | FTP | other *** search
- #include <math.h>
-
- #define ITMAX 100
- #define CGOLD 0.3819660
- #define ZEPS 1.0e-10
- #define SIGN(a,b) ((b) > 0.0 ? fabs(a) : -fabs(a))
- #define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);
-
- double brent(ax,bx,cx,f,tol,xmin)
- double ax,bx,cx,tol,*xmin;
- double (*f)(); /* ANSI: double (*f)(double); */
- {
- int iter;
- double a,b,d,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm;
- double e=0.0;
- void nrerror();
-
- a=((ax < cx) ? ax : cx);
- b=((ax > cx) ? ax : cx);
- x=w=v=bx;
- fw=fv=fx=(*f)(x);
- for (iter=1;iter<=ITMAX;iter++) {
- xm=0.5*(a+b);
- tol2=2.0*(tol1=tol*fabs(x)+ZEPS);
- if (fabs(x-xm) <= (tol2-0.5*(b-a))) {
- *xmin=x;
- return fx;
- }
- if (fabs(e) > tol1) {
- r=(x-w)*(fx-fv);
- q=(x-v)*(fx-fw);
- p=(x-v)*q-(x-w)*r;
- q=2.0*(q-r);
- if (q > 0.0) p = -p;
- q=fabs(q);
- etemp=e;
- e=d;
- if (fabs(p) >= fabs(0.5*q*etemp) ||
- p <= q*(a-x) || p >= q*(b-x)) {
- d=CGOLD*(e=(x >= xm ? a-x : b-x));
- } else {
- d=p/q;
- u=x+d;
- if (u-a < tol2 || b-u < tol2)
- d=SIGN(tol1,xm-x);
- }
- } else {
- d=CGOLD*(e=(x >= xm ? a-x : b-x));
- }
- u=(fabs(d) >= tol1 ? x+d : x+SIGN(tol1,d));
- fu=(*f)(u);
- if (fu <= fx) {
- if (u >= x) a=x; else b=x;
- SHFT(v,w,x,u)
- SHFT(fv,fw,fx,fu)
- } else {
- if (u < x) a=u; else b=u;
- if (fu <= fw || w == x) {
- v=w;
- w=u;
- fv=fw;
- fw=fu;
- } else if (fu <= fv || v == x || v == w) {
- v=u;
- fv=fu;
- }
- }
- }
- nrerror("Too many iterations in BRENT");
- *xmin=x;
- return fx;
- }
-
- #undef ITMAX
- #undef CGOLD
- #undef ZEPS
- #undef SIGN
- extern int ncom; /* defined in LINMIN */
- extern double *pcom,*xicom,(*nrfunc)();
-
- double f1dim(x)
- double x;
- {
- int j;
- double f,*xt,*vector();
- void free_vector();
-
- xt=vector(1,ncom);
- for (j=1;j<=ncom;j++) xt[j]=pcom[j]+x*xicom[j];
- f=(*nrfunc)(xt);
- free_vector(xt,1,ncom);
- return f;
- }
- #define TOL 2.0e-4
-
- int ncom=0; /* defining declarations */
- double *pcom=0,*xicom=0,(*nrfunc)();
-
- void linmin(p,xi,n,fret,func)
- double p[],xi[],*fret,(*func)();
- int n;
- {
- int j;
- double xx,xmin,fx,fb,fa,bx,ax;
- double brent(),f1dim(),*vector();
- void mnbrak(),free_vector();
-
- ncom=n;
- pcom=vector(1,n);
- xicom=vector(1,n);
- nrfunc=func;
- for (j=1;j<=n;j++) {
- pcom[j]=p[j];
- xicom[j]=xi[j];
- }
- ax=0.0;
- xx=1.0;
- bx=2.0;
- mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,f1dim);
- *fret=brent(ax,xx,bx,f1dim,TOL,&xmin);
- for (j=1;j<=n;j++) {
- xi[j] *= xmin;
- p[j] += xi[j];
- }
- free_vector(xicom,1,n);
- free_vector(pcom,1,n);
- }
-
- #undef TOL
- #include <math.h>
-
- #define GOLD 1.618034
- #define GLIMIT 100.0
- #define TINY 1.0e-20
- #define MAX(a,b) ((a) > (b) ? (a) : (b))
- #define SIGN(a,b) ((b) > 0.0 ? fabs(a) : -fabs(a))
- #define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);
-
- void mnbrak(ax,bx,cx,fa,fb,fc,func)
- double *ax,*bx,*cx,*fa,*fb,*fc;
- double (*func)(); /* ANSI: double (*func)(double); */
- {
- double ulim,u,r,q,fu,dum;
-
- *fa=(*func)(*ax);
- *fb=(*func)(*bx);
- if (*fb > *fa) {
- SHFT(dum,*ax,*bx,dum)
- SHFT(dum,*fb,*fa,dum)
- }
- *cx=(*bx)+GOLD*(*bx-*ax);
- *fc=(*func)(*cx);
- while (*fb > *fc) {
- r=(*bx-*ax)*(*fb-*fc);
- q=(*bx-*cx)*(*fb-*fa);
- u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/
- (2.0*SIGN(MAX(fabs(q-r),TINY),q-r));
- ulim=(*bx)+GLIMIT*(*cx-*bx);
- if ((*bx-u)*(u-*cx) > 0.0) {
- fu=(*func)(u);
- if (fu < *fc) {
- *ax=(*bx);
- *bx=u;
- *fa=(*fb);
- *fb=fu;
- return;
- } else if (fu > *fb) {
- *cx=u;
- *fc=fu;
- return;
- }
- u=(*cx)+GOLD*(*cx-*bx);
- fu=(*func)(u);
- } else if ((*cx-u)*(u-ulim) > 0.0) {
- fu=(*func)(u);
- if (fu < *fc) {
- SHFT(*bx,*cx,u,*cx+GOLD*(*cx-*bx))
- SHFT(*fb,*fc,fu,(*func)(u))
- }
- } else if ((u-ulim)*(ulim-*cx) >= 0.0) {
- u=ulim;
- fu=(*func)(u);
- } else {
- u=(*cx)+GOLD*(*cx-*bx);
- fu=(*func)(u);
- }
- SHFT(*ax,*bx,*cx,u)
- SHFT(*fa,*fb,*fc,fu)
- }
- }
-
- #undef GOLD
- #undef GLIMIT
- #undef TINY
- #undef MAX
- #undef SIGN
- #undef SHFT
- #include <math.h>
-
- #define ITMAX 200
- static double sqrarg;
- #define SQR(a) (sqrarg=(a),sqrarg*sqrarg)
-
- void powell(double p[],double **xi, int n, double ftol, int *iter, double *fret, double (*func)());
- void powell(p,xi,n,ftol,iter,fret,func)
- double p[],**xi,ftol,*fret,(*func)();
- int n,*iter;
- {
- int i,ibig,j;
- double t,fptt,fp,del;
- double *pt,*ptt,*xit,*vector();
- void linmin(),nrerror(),free_vector();
-
- pt=vector(1,n);
- ptt=vector(1,n);
- xit=vector(1,n);
- *fret=(*func)(p);
- for (j=1;j<=n;j++) pt[j]=p[j];
- for (*iter=1;;(*iter)++) {
- fp=(*fret);
- ibig=0;
- del=0.0;
- for (i=1;i<=n;i++) {
- for (j=1;j<=n;j++) xit[j]=xi[j][i];
- fptt=(*fret);
- linmin(p,xit,n,fret,func);
- if (fabs(fptt-(*fret)) > del) {
- del=fabs(fptt-(*fret));
- ibig=i;
- }
- }
- if (2.0*fabs(fp-(*fret)) <= ftol*(fabs(fp)+fabs(*fret))) {
- free_vector(xit,1,n);
- free_vector(ptt,1,n);
- free_vector(pt,1,n);
- return;
- }
- if (*iter == ITMAX) nrerror("Too many iterations in routine POWELL");
- for (j=1;j<=n;j++) {
- ptt[j]=2.0*p[j]-pt[j];
- xit[j]=p[j]-pt[j];
- pt[j]=p[j];
- }
- fptt=(*func)(ptt);
- if (fptt < fp) {
- t=2.0*(fp-2.0*(*fret)+fptt)*SQR(fp-(*fret)-del)-del*SQR(fp-fptt);
- if (t < 0.0) {
- linmin(p,xit,n,fret,func);
- for (j=1;j<=n;j++) xi[j][ibig]=xit[j];
- }
- }
- }
- }
-
- #undef ITMAX
- #undef SQR
-
- #ifdef __TURBOC__
- #include <alloc.h>
- #endif
- #include <stdio.h>
-
- void nrerror(error_text)
- char error_text[];
- {
- void exit();
-
- fprintf(stderr,"Numerical Recipes run-time error...\n");
- fprintf(stderr,"%s\n",error_text);
- fprintf(stderr,"...now exiting to system...\n");
- exit(1);
- }
-
-
-
- double *vector(nl,nh)
- int nl,nh;
- {
- double *v;
-
- v=(double *)malloc((unsigned) (nh-nl+1)*sizeof(double));
- if (!v) nrerror("allocation failure in vector()");
- return v-nl;
- }
-
- double **matrix(nrl,nrh,ncl,nch)
- int nrl,nrh,ncl,nch;
- {
- int i;
- double **m;
-
- m=(double **) malloc((unsigned) (nrh-nrl+1)*sizeof(double*));
- if (!m) nrerror("allocation failure 1 in matrix()");
- m -= nrl;
-
- for(i=nrl;i<=nrh;i++) {
- m[i]=(double *) malloc((unsigned) (nch-ncl+1)*sizeof(double));
- if (!m[i]) nrerror("allocation failure 2 in matrix()");
- m[i] -= ncl;
- }
- return m;
- }
-
- void free_vector(v,nl,nh)
- double *v;
- int nl,nh;
- {
- free((char*) (v+nl));
- }
-
- void free_matrix(m,nrl,nrh,ncl,nch)
- double **m;
- int nrl,nrh,ncl,nch;
- {
- int i;
-
- for(i=nrh;i>=nrl;i--) free((char*) (m[i]+ncl));
- free((char*) (m+nrl));
- }
-
-